import time
from datetime import datetime, timedelta

from flask import abort
from flask import current_app, jsonify
from flask import g
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for

from info import constants, db
from info.models import User, News, Category
from info.modules.admin import admin_blu
from info.utils.common import user_login_data
from info.utils.image_storage import storage
from info.utils.response_code import RET


@admin_blu.route('/news_edit')
def news_edit():
    page = request.args.get('p',1)
    keywords = request.args.get('keywords','')
    try:
        page = int(page)
    except Exception as e:
        page = 1
        current_app.logger.error(e)
    filter = []
    if keywords:
        filter.append(News.title.contains(keywords))
    current_page = 1
    total_page = 1
    new_list = []
    try:
        pagination = News.query.filter(*filter).order_by(News.create_time.desc()).paginate(page,constants.ADMIN_NEWS_PAGE_MAX_COUNT,False)
        new_list = pagination.items
        current_page = pagination.page
        total_page = pagination.pages
    except Exception as e:
        current_app.logger.error(e)
    new_list_dict = []
    for news in new_list:
        new_list_dict.append(news.to_basic_dict())

    context = {'current_page':current_page,'total_page':total_page,'news':new_list_dict}


    return render_template('admin/news_edit.html',data = context)

@admin_blu.route('/news_edit_detail',methods = ['POST','GET'])
def news_edit_detail():

    if request.method == 'GET':
        news_id = request.args.get('id')
        if not news_id:
            abort(404)
        try:
            news_id = int(news_id)
        except Exception as  e:
            current_app.logger.error(e)
            abort(404)
        try:
            news = News.query.get(news_id)
        except Exception as e:
            current_app.logger.error(e)
            abort(404)

        if not news:
            return render_template('admin/news_edit_detail.html',data = { 'errmsg':'数据不存在'})

        categories = Category.query.all()
        category_li = []
        for category in categories:
            c_dict=category.to_dict()
            c_dict['is_selected'] = False
            if news.category_id == category.id:
                c_dict['is_selected'] = False
            category_li.append(c_dict)
        category_li.pop(0)

        data = {'news':news.to_dict(),
                'category':category_li}

        return render_template('admin/news_edit_detail.html',data = data)

    # post请求
    news_id = request.form.get('news_id')
    category_id = request.form.get('category_id')
    digest = request.form.get('digest')
    content = request.form.get('content')
    index_image = request.files.get('index_image')
    title = request.form.get('title')

    if not all([news_id,category_id,digest,content,index_image]):
        return jsonify(errno = RET.PARAMERR,errmsg = '参数不够')
    try:
        news_id = int(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.PARAMERR,errmsg = '参数错误')

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.DBERR,errmsg = '数据库查询错误')

    if not news:
        return jsonify(errno = RET.NODATA,errmsg = '数据不存在')

    try:
        index_image = index_image.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.PARAMERR,errmsg = '图片错误')
    try:
        key = storage(index_image)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.THIRDERR,errmsg = '第三方错误')
    index_image_url = constants.QINIU_DOMIN_PREFIX+key
    news.index_image_url = index_image_url

    news.digest = digest
    news.content = content
    news.category_id = category_id
    news.title = title

    return jsonify(errno = RET.OK,errmsg = 'ok')


@admin_blu.route('/add_category',methods = ['POST'])
def add_category():
    category_id = request.json.get('id')
    category_name = request.json.get('name')
    if not category_name:
        return jsonify(errno = RET.PARAMERR,errmsg = '参数错误')
    # 如果有id,则是修改
    if category_id:
        try:
            category = Category.query.get(category_id)
        except Exception as  e:
            current_app.looger.error(e)
            return jsonify(errno = RET.DBERR,errmsg = "数据库查询错误" )
        if not category:
            return jsonify(errno = RET.NODATA,errmsg = '查询不到数据')

        category.name = category_name
    # 有id则是新建一个类别
    else:
        category = Category()
        category.name = category_name
        db.session.add(category)
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno = RET.DBERR,errmsg = '数据存储失败')

    return jsonify(errno = RET.OK,errmsg = 'ok')


@admin_blu.route('/news_type')
def news_type():
    categories = Category.query.all()
    categories_dict = []
    for category in categories:
        categories_dict.append(category.to_dict())
    categories_dict.pop(0)
    data = {'category':categories_dict}
    return render_template('admin/news_type.html',data = data)


@admin_blu.route('/news_review_detail',methods=['POST','GET'])
def news_review_detail():
    """新闻审核"""

    # 获取新闻id
    if request.method == 'GET':
        news_id = request.args.get("news_id")
        if not news_id:
            return render_template('admin/news_review_detail.html', data={"errmsg": "未查询到此新闻"})

        # 通过id查询新闻
        news = None
        try:
            news = News.query.get(news_id)
        except Exception as e:
            current_app.logger.error(e)

        if not news:
            return render_template('admin/news_review_detail.html' ,data={"errmsg": "未查询到此新闻"})

    # 返回数据
        data = {"news": news.to_dict()}
        return render_template('admin/news_review_detail.html',data=data)



    news_id = request.json.get('news_id')
    action = request.json.get('action')
    if not all([news_id,action]):
        return jsonify(errno = RET.PARAMERR,errmsg='参数错误')

    if action not in ['accept','reject']:
        return jsonify(errno=RET.PARAMERR, errmsg = '参数有误')
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = '数据库查询错误')

    if not news:
        return jsonify(errno = RET.DBERR,errmsg = '未查询到新闻')

    if action == 'accept':
        news.status = 0
    else:
        reason = request.json.get('reason')
        if not reason:
            return jsonify(errno=RET.PARAMERR,errmsg = '未说明原因')
        news.reason = reason
        news.status = -1
    return jsonify(errno=RET.OK,errmsg = '请求成功')

@admin_blu.route('/news_review')
def news_review():
    """返回待审核新闻列表"""

    page = request.args.get("p", 1)
    keywords = request.args.get('keysword')
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1

    news_list = []
    current_page = 1
    total_page = 1

    try:
        filter = [News.status != 0]
        if keywords:
            filter.append(News.title.contains(keywords))

        paginate = News.query.filter(*filter).order_by(News.create_time.desc()).paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)

        news_list = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    news_dict_list = []
    for news in news_list:
        news_dict_list.append(news.to_review_dict())

    context = {"total_page": total_page, "current_page": current_page, "news_list": news_dict_list}

    return render_template('admin/news_review.html', data=context)

@admin_blu.route('/user_list')
def user_list():
    page = request.args.get('p',1)
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
    users = []
    total_page = 1
    current_app = 1
    try:
        paginate = User.query.filter(User.is_admin==False).order_by(User.last_login.desc()).paginate(page,constants.ADMIN_NEWS_PAGE_MAX_COUNT,False)
        users = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    users_list = []
    for user in users:
        users_list.append(user.to_admin_dict())

    context = {'current_page':current_page,'total_page':total_page,'users':users_list}
    return render_template('admin/user_list.html',data = context)


@admin_blu.route('/user_count')
def user_count():

    total_count = 0
    try:
        total_count = User.query.filter(User.is_admin == False).count()
    except Exception as e:
        current_app.logger.error(e)
        return

    # 查询月新增加用户
    mon_count = 0
    try:
        now = time.localtime()
        mon_begin = '%d-%02d-01' %(now.tm_year,now.tm_mon)
        mon_begin_date = datetime.strptime(mon_begin,'%Y-%m-%d')
        mon_count = User.query.filter(User.is_admin == False,User.create_time >= mon_begin_date).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询日新增数
    day_count = 0
    try:
        day_begin = '%d-%02d-%02d' %(now.tm_year,now.tm_mon,now.tm_mday)
        day_begin_date = datetime.strptime(day_begin,'%Y-%m-%d')
        day_count = User.query.filter(User.is_admin == False,User.create_time > day_begin_date).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询图表所需要的信息
    # 这个月每天的用户活跃数

    now_date = datetime.strptime(datetime.now().strftime('%Y-%m-%d'),'%Y-%m-%d')
    active_date = []
    active_count = []
    for i in range(0,31):
        begin_date = now_date - timedelta(days=i)
        end_date = now_date - timedelta(days=(i-1))
        active_date.append(begin_date.strftime('%Y-%m-%d'))
        count = 0
        try:
            count = User.query.filter(User.is_admin == False,User.last_login>=begin_date,User.last_login<end_date).count()
        except Exception as  e:
            current_app.logger.error(e)
        active_count.append(count)
    active_count.reverse()
    active_date.reverse()


    data = {'total_count':total_count,'mon_count':mon_count,'day_count':day_count,'active_count':active_count,'active_date':active_date}
    return render_template('admin/user_count.html',data = data)

@admin_blu.route('/login',methods = ['POST','GET'])
def admin_login():
    if request.method == 'GET':
        user_id = session.get('user_id',None)
        password = session.get('is_admin',False)
        if user_id and password:
            return redirect(url_for('admin.admin_index'))
        return render_template('admin/login.html')
    username = request.form.get('username')
    password = request.form.get('password')

    if not all([username,password]):
        return render_template('admin/login.html',errmsg='参数错误')
    try:
        user = User.query.filter(User.mobile == username).first()
    except Exception as e:
        current_app.logger.error(e)
        return render_template('admin/login.html',errmsg='数据库查询错误')

    if not user:
        return render_template('admin/login.html',errmsg = '查询用户不存在')

    if not user.check_password(password):
        return render_template('admin/login.html',errmsg='密码输入错误')

    if not user.is_admin:
        return render_template('admin/login.html',errmsg='用户权限错误')

    session['user_id']=user.id
    session['mobile']=user.mobile
    session['nickname'] = user.nick_name
    session['is_admin'] = user.is_admin
    return redirect(url_for('admin.admin_index'))


@admin_blu.route('/index')
@user_login_data
def admin_index():
    user = g.user

    data = {'user':user.to_dict() }
    return render_template('admin/index.html',data = data)

